双方向エンティティ関係は、春を使用したIDはnullを節約します

kokuone :

私はJpaRepositoryと春ブーツについて学んだし、私はこの問題で停滞です。私は、オブジェクトのリストを保存するためにtriyingだが、彼らは双方向の関係にあるすべてのオブジェクトのidはnullで保存し、私は多くの例を見て、それが働いたすべてはOK、でも私は同じ例が異なる事業体とし、その別のプロジェクトを持っています正常に動作しますが、私は私の問題で正しく自分自身を表明している願っています

Aクラス

@Entity
@Table(name="producto")
public class Producto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;

    // there are more attributes but i'm hiding It to show less code to  try this more easier to see

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="proveedor_id")
    private Proveedor proveedor;

// getters and setter

// constructor empty and others constructors

別のクラス

@Entity
@Table(name="proveedores")
public class Proveedor {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name="id")
   private Long id;


   @OneToMany(mappedBy = "proveedor", cascade = CascadeType.ALL)
   private List<Producto> listaProducto =  new ArrayList<Producto>();

// getters and setter

// constructor empty and others constructors

これはテストです

   @Test
   void addProveedorConProductos() {
   Proveedor test = new Proveedor();
   List<Producto> lista = new ArrayList<Producto>();
       lista.add(new Producto("bbb","pruebaTest2",123,null,null,null));
       lista.add(new Producto("a","pruebaTest21111",123,null,null,null));
       test = new Proveedor("pruebaTestCase", 12345,lista);
       assertNotNull(proveedor.save(test));

   }

結果

すべてがOKを保存して、id_proveedorはヌルを保存し、これは結果の画像であるhttps://imgur.com/a/7JDMvrp

日本の労働:

私はすでに同じ状況を予測実装しました。あなたは、あなたの問題を解決するために多くのアイデアを持っている願って、私のコードを参照することができます。

最初のステップ:ユーザエンティティと多対多の関係を持っている役割のエンティティを作成します。

package com.tvp.springrest.role;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

import com.tvp.springrest.user.User;

import lombok.Data;

@Entity
@Data
@Table(name = "role")
public class Role {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Enumerated(EnumType.STRING)
private ERole name;

@ManyToMany(mappedBy = "roles")
private List<User> users;

public Role(ERole name) {
    this.name = name;
}

public Role() {
}

}

列挙型の役割を作成します。

package com.tvp.springrest.role;

public enum ERole {
USER("USER"),
MODERATOR("MODERATOR"),
ADMIN("ADMIN");

private String value;

ERole(String value){
    this.value = value;
}

public String getValue() {
    return value;
}

public static ERole fromString(String roleString){
    for(ERole role: ERole.values()){
        if(role.getValue().equalsIgnoreCase(roleString)){
            return role;
        }
    }
    return null;
}
}

第二ステップ:Userエンティティを作成します。

package com.tvp.springrest.user;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

import com.tvp.springrest.role.Role;

import lombok.Data;

@Entity
@Data
@Table(name = "users",
uniqueConstraints = {
    @UniqueConstraint(columnNames = "username"),
    @UniqueConstraint(columnNames =  "email")
}
)
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotBlank
@Size(max = 20)
private String username;

@NotBlank
@Size(max = 50)
@Email
private String email;

@NotBlank
@Size(max = 120)
private String password;

@ManyToMany
@JoinTable(name = "user_role",
    joinColumns =  @JoinColumn(name = "user_id"),
    inverseJoinColumns = @JoinColumn(name = "role_id")
)
private Set<Role> roles = new HashSet<>();

public User(@NotBlank @Size(max = 20) String username, @NotBlank @Size(max = 50) @Email String email,
        @NotBlank @Size(max = 120) String password) {
    this.username = username;
    this.email = email;
    this.password = password;
}

public User() {
}

public User(@NotBlank @Size(max = 20) String username, @NotBlank @Size(max = 50) @Email String email,
        @NotBlank @Size(max = 120) String password, Set<Role> roles) {
    this.username = username;
    this.email = email;
    this.password = password;
    this.roles = roles;
}

}

第三ステップ:あなたは、役割とユーザエンティティのためのリポジトリを作成する必要が

package com.tvp.springrest.role;

import java.util.Optional;

import org.springframework.stereotype.Repository;
import org.springframework.data.jpa.repository.JpaRepository;

@Repository
public interface RoleRepository extends JpaRepository<Role, Long> {
  Optional<Role> findByName(ERole name);
}

ユーザーのために

package com.tvp.springrest.user;

import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long>{

Optional<User> findByUsername(String username);

Boolean existsByUsername(String username);

Boolean existsByEmail(String name);

}

その後、あなたは、データベース用のデータを作成することができます。

package com.tvp.springrest;

import java.util.HashSet;
import java.util.Set;

import com.tvp.springrest.employee.EmployeeRepository;
import com.tvp.springrest.order.OrderRepository;
import com.tvp.springrest.role.ERole;
import com.tvp.springrest.role.Role;
import com.tvp.springrest.role.RoleRepository;
import com.tvp.springrest.user.User;
import com.tvp.springrest.user.UserRepository;

import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import lombok.extern.slf4j.Slf4j;

@Configuration
public class LoadDatabase {

@Bean
CommandLineRunner initDatabase(
  RoleRepository roleRepository, UserRepository userRepository) {
return args -> {

  roleRepository.save(new Role(ERole.ADMIN));
  roleRepository.save(new Role(ERole.MODERATOR));
  roleRepository.save(new Role(ERole.USER));

  Set<Role> roles = new HashSet<>();
  roles.add(roleRepository.findByName(ERole.ADMIN).get());
  roles.add(roleRepository.findByName(ERole.MODERATOR).get());
  roles.add(roleRepository.findByName(ERole.USER).get());

  Set<Role> roles1 = new HashSet<>();
  roles1.add(roleRepository.findByName(ERole.USER).get());

  Set<Role> roles2 = new HashSet<>();
  roles2.add(roleRepository.findByName(ERole.MODERATOR).get());

  userRepository.save(new User("test1", "[email protected]", "123456", roles));
  userRepository.save(new User("test2", "[email protected]", "123456", roles1));
  userRepository.save(new User("test3", "[email protected]", "123456", roles2));

};
}

}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=282393&siteId=1