繁体   English   中英

Hibernate 在复合外键中插入 null 值

[英]Hibernate insert null values ​in composite foreign key

我有两个简单的域对象,如下所示:

用户:

@Entity
@Table(name="USER")
@IdClass(UserPK.class)
public class User implements Serializable {

    //...
    @Id
    @Column(name = "FISCALCODE")
    private String fiscalCode;

    @Id
    @Column(name = "USERNUMBER")
    private String userNumber;

    @OneToMany(mappedBy="user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Items> items;
    
    // getters and setters
}

用户PK:

public class UserPK implements Serializable {
        
  @Column(name = "FISCALCODE")
  private String fiscalCode;
    
  @Column(name = "USERNUMBER")
  private String userNumber;

  // getter and setter
}

项目:

@Entity
@Table(name="ITEMS")
public class Items implements Serializable {
        
    //...
    @Id
    @Column(name = "ID_ITEM")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_item_generator")
    @SequenceGenerator( name = "id_item_generator", sequenceName = "ITEM_SEQ", allocationSize = 1)
    private Integer id;
            
    @ManyToOne
    @JoinColumns({
         @JoinColumn(name="FISCALCODE"),
         @JoinColumn(name="USERNUMBER")
    })
    private User user;
        
    // getters and setters
}

数据库表:

user { fiscalcode, usernumber, other columns... }    // fiscalcode+usernumber = PK
items { id, fiscalcode, usernumber, other columns... }  // fiscalcode,usernumber is a foreign key

CONTROLLER:  

      @RequestMapping(value="/user", method = RequestMethod.POST, produces = "application/json")
        public Object postUser(@RequestBody(required = false) User user){
        //connection etc..
        session.save(user);
        //...
        return new ResponseEntity<>(HttpStatus.OK);
      }

为什么当我运行命令session.save(user) Hibernate 在ITEMS表的FISCALCODEUSERNUMBER列中插入值 null 时?

我尝试在 getter 上设置ManyToOneJoinColumns ,但结果是一样的。

编辑:我添加了我的 POST 操作方法

  1. 正如@JoinColumns文档中所述:

使用JoinColumns注释时,必须在每个此类JoinColumn注释中指定namereferencedColumnName的ColumnName 元素。

因此,您应该更正您的映射,如下所示:

@ManyToOne
@JoinColumns({
    @JoinColumn(name="FISCALCODE", referencedColumnName = "FISCALCODE"),
    @JoinColumn(name="USERNUMBER", referencedColumnName = "USERNUMBER")
})
private User user;
  1. 每当形成双向关联时,应用程序开发人员必须确保双方始终保持同步。

因此,您应该在您的User实体中使用addItem()removeItem()实用方法,以便在添加或删除子元素时同步两端,如下所示。

@Entity
@Table(name="USER")
@IdClass(UserPK.class)
public class User implements Serializable {

    //...

    @OneToMany(mappedBy="user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Items> items;
    
    // getters and setters

   public void addItem(Items item) {
      this.items.add(item);
      item.setUser(this);
   }

   public void removeItem(Items item) {
      this.items.remove(item);
      item.setUser(null);
   }
}

保存示例:

User user = new User();
user.setFiscalCode("Code1");
user.setUserNumber("User1");
// ...

Items item1 = new Items();
Items item2 = new Items();
// ...
      
user.addItem(item1);
user.addItem(item2);
      
session.save(user);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM