0

我有两个 DTO:

@Entity
@Table( name = "USER" )
public class UserDto implements Serializable 
{
    @Id
    @GeneratedValue( generator = "trigger_gen" )
    @GenericGenerator( name = "trigger_gen", strategy = "path.TriggerAssignedIdentityGenerator" )
    @Column( nullable = true, length = 14, name = "USER_ID" )
    private Long userId;

    @OneToMany( cascade =
    { CascadeType.ALL }, mappedBy = "userIdOwner" )
     private Set< AdressDto > addresses;

    //getters and setters
}

@Entity
@Table( name = "ADDRESS" )
public class AddressDto implements Serializable
{
    @Id
    @GeneratedValue( generator = "trigger_gen" )
    @GenericGenerator( name = "trigger_gen", strategy = "path.TriggerAssignedIdentityGenerator" )
    @Column( nullable = true, length = 14, name = "ADDRESS_ID" )
    private Long addressId;

    @Column( nullable = true, length = 14, name = "USER_ID", insertable = false, updatable = false )
    private Long userId;

    @ManyToOne( fetch = FetchType.LAZY )
    @JoinColumn( name = "USER_ID", insertable = true, updatable = true )
    private UserDto userIdOwner;

    //getters and setters
}

我想做类似的事情:

AddressDto address = new AddressDto();
Set<AddressDto> addresses = Sets.newHashSet();
addresses.add(address);

UserDto user = new UserDto()
user.setAddresses(addresses);

session.persist(user);

但我有一个错误 ConstraintViolationException cannot set 'NULL' into addressId。我究竟做错了什么?我应该怎么做才能使它起作用?

4

1 回答 1

1

您需要在两个方向上关联实体才能使级联工作。

AddressDto address = new AddressDto();
UserDto user = new UserDto()

user.getAddresses().add(address);
address.setUser(user);

session.persist(user);

我在您的地址实体中注意到了这一点:

   @Column( nullable = true, length = 14, name = "USER_ID", insertable = false, updatable = false )
   private Long userId;

这似乎没有必要,因为您已经获得了如下所示的User映射@ManyToOne

于 2014-04-11T13:53:58.210 回答