Java Hibernate中的多对多关系和额外列
我有这样的数据库结构。它用于我的应用程序中的用户访问控制Java Hibernate中的多对多关系和额外列,java,spring,hibernate,Java,Spring,Hibernate,我有这样的数据库结构。它用于我的应用程序中的用户访问控制 UserGroup ========== id (PK) code name HakAkses ========== id(PK) UserGroup_id (FK) Akses_id (FK) action_create action_read action_update action_delete Akses ========== id(PK) code 我这样做hibernate注释
UserGroup
==========
id (PK)
code
name
HakAkses
==========
id(PK)
UserGroup_id (FK)
Akses_id (FK)
action_create
action_read
action_update
action_delete
Akses
==========
id(PK)
code
我这样做hibernate注释
@Entity
@Table(name = "[Master].[UserGroup]")
public class UserGroup implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(unique = true, length = 10)
private String kode;
private String nama;
@OneToMany(mappedBy = "userGroup")
private Set<HakAkses> hakAksesSet;
}
@Entity
@Table(name = "[master].[HakAkses]")
public class HakAkses implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = "UserGroup_id", nullable = false)
private UserGroup userGroup;
@ManyToOne
@JoinColumn(name = "Akses_id", nullable = false)
private Akses akses;
@Column(name = "action_create")
private boolean canCreate;
@Column(name = "action_read")
private boolean canRead;
@Column(name = "action_update")
private boolean canUpdate;
@Column(name = "action_delete")
private boolean canDelete;
}
@Entity
@Table(name = "[master].[Akses]")
public class Akses implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(unique = true)
private String kode;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "akses")
private List<HakAkses> hakAksesSet;
}
@实体
@表(name=“[Master].[UserGroup]”)
公共类UserGroup实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@列(唯一=真,长度=10)
私人字符串科德;
私有字符串nama;
@OneToMany(mappedBy=“用户组”)
私有集hakakseset;
}
@实体
@表(name=“[master].[HakAkses]”)
公共类HakAkses实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@许多酮
@JoinColumn(name=“UserGroup\u id”,null=false)
私有用户组用户组;
@许多酮
@JoinColumn(name=“Akses_id”,null=false)
私人阿克塞阿克塞;
@列(name=“action\u create”)
私有布尔canCreate;
@列(name=“action\u read”)
私有布尔可读;
@列(name=“action\u update”)
私有布尔更新;
@列(name=“action\u delete”)
私有布尔烛台;
}
@实体
@表(name=“[master].[Akses]”)
公共类Akses实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@列(唯一=真)
私人字符串科德;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“akses”)
私人名单;
}
然后我用这个代码在我的测试仪中进行了测试
UserGroup userGroup = new UserGroup(kode, nama);
userGroup.setHakAksesSet(new HashSet<HakAkses>(hakAksesList));
this.controller.save(userGroup);
UserGroup UserGroup=新用户组(kode,nama);
sethakakset(新HashSet(hakakslist));
this.controller.save(用户组);
但是,当我运行测试仪时,数据保存在仅数据库用户组数据中。
我的hibernate注释有问题吗
谢谢这是因为父实体上缺少级联注释。看看这是否有帮助
@Table(name = "[Master].[UserGroup]")
public class UserGroup implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(unique = true, length = 10)
private String kode;
private String nama;
@OneToMany(mappedBy = "userGroup", cascade = CascadeType.ALL)
private Set<HakAkses> hakAksesSet;
}
@Table(name=“[Master].[UserGroup]”)
公共类UserGroup实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@列(唯一=真,长度=10)
私人字符串科德;
私有字符串nama;
@OneToMany(mappedBy=“userGroup”,cascade=CascadeType.ALL)
私有集hakakseset;
}
您的映射使用mappedBy
,在其他设置中,它会将inverse=“true”
设置注入到一对多端。请在此处阅读更多信息:
- mkyong
- 反向设置是我们需要的。它提高了性能(这归功于mappedBy)
- 但仅在
一侧设置关系是不够的。我们必须为每个孩子设置一个家长一对多
UserGroup userGroup = new UserGroup(kode, nama);
userGroup.setHakAksesSet(new HashSet<HakAkses>(hakAksesList));
// this is not enough - we also MUST
// FOR each HakAkses in the list
// SET a Parent, i.e hakAksses.setUserGroup(userGroup)
非常感谢。你的回答帮助我解决了这个问题。很高兴看到这一点,先生:)享受神奇的冬眠:)
Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush();
UserGroup userGroup = new UserGroup(kode, nama);
userGroup.setHakAksesSet(new HashSet<HakAkses>(hakAksesList));
// this is not enough - we also MUST
// FOR each HakAkses in the list
// SET a Parent, i.e hakAksses.setUserGroup(userGroup)
@OneToMany(mappedBy = "userGroup", cascade = CascadeType.ALL)