gpt4 book ai didi

java - JPA多对多持久连接表

转载 作者:搜寻专家 更新时间:2023-11-01 01:43:37 25 4
gpt4 key购买 nike

我有两个具有多对多关系的表。当我坚持用户不插入任何东西来连接表时,我映射了这两个实体。我正在调试直到坚持,我看到组列表不为空。

没有错误信息只是持久化用户。

用户<-->用户组<-->组

我正在使用 netbeans 7.3、Glassfish 3.1.2.2、postgresql 9.1 和 eclipselink 2

另外,我试图显示以下属性对我不起作用的 sql 脚本。

        <property name="eclipselink.logging.logger" value="ServerLogger"/>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.logging.level.sql" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>

抽象 DAO:

public abstract class GenericDAO<E> implements Serializable{

@PersistenceContext
EntityManager entityManager;

public void persist(E object){
entityManager.persist(object);
}

public void merge(E object){
entityManager.merge(object);
}

public void delete(E object){
object = entityManager.merge(object);
entityManager.remove(object);
}
}

用户实体:

   @Entity
@Table(name = "users")
@XmlRootElement
@NamedQueries(
{
@NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
@NamedQuery(name = "Users.findByUserId", query = "SELECT u FROM Users u WHERE u.userId = :userId"),
@NamedQuery(name = "Users.findByName", query = "SELECT u FROM Users u WHERE u.name = :name"),
@NamedQuery(name = "Users.findBySurname", query = "SELECT u FROM Users u WHERE u.surname = :surname"),
@NamedQuery(name = "Users.findByEmail", query = "SELECT u FROM Users u WHERE u.email = :email"),
@NamedQuery(name = "Users.findByUsername", query = "SELECT u FROM Users u WHERE u.username = :username"),
@NamedQuery(name = "Users.findByPassword", query = "SELECT u FROM Users u WHERE u.password = :password")
})
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "user_id")
private Integer userId;
@Size(max = 2147483647)
@Column(name = "name")
private String name;
@Size(max = 2147483647)
@Column(name = "surname")
private String surname;
// @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
@Size(max = 2147483647)
@Column(name = "email")
private String email;
@Size(max = 2147483647)
@Column(name = "username")
private String username;
@Size(max = 2147483647)
@Column(name = "password")
private String password;
@ManyToMany(mappedBy = "usersList")
private List<Groups> groupsList;
@OneToMany(mappedBy = "userId")
private List<Person> personList;

//Getters Setters

群组实体:

@Entity
@Table(name = "groups")
@XmlRootElement
@NamedQueries(
{
@NamedQuery(name = "Groups.findAll", query = "SELECT g FROM Groups g"),
@NamedQuery(name = "Groups.findByGroupId", query = "SELECT g FROM Groups g WHERE g.groupId = :groupId"),
@NamedQuery(name = "Groups.findByGroupName", query = "SELECT g FROM Groups g WHERE g.groupName = :groupName"),
@NamedQuery(name = "Groups.findByGroupDescription", query = "SELECT g FROM Groups g WHERE g.groupDescription = :groupDescription")
})
public class Groups implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "group_id")
private Integer groupId;
@Size(max = 2147483647)
@Column(name = "group_name")
private String groupName;
@Size(max = 2147483647)
@Column(name = "group_description")
private String groupDescription;
@JoinTable(name = "user_group", joinColumns =
{
@JoinColumn(name = "group_id", referencedColumnName = "group_id")
}, inverseJoinColumns =
{
@JoinColumn(name = "user_id", referencedColumnName = "user_id")
})
@ManyToMany(fetch = FetchType.EAGER)
private List<Users> usersList;
//Getters Setters

用户 DAO:

public class UserDAO extends GenericDAO<Users> implements Serializable {

public List<Users> getAllUsers()
{
Query query = entityManager.createNamedQuery("Users.findAll");
List<Users> users = query.getResultList();
return users;
}
}

最佳答案

您需要启用 cascade用于合并(使用 PERSIST )或使用 ALL 的所有操作.

@ManyToMany(mappedBy = "usersList", cascade = CascadeType.PERSIST)
private List<Groups> groupsList;

If I set CascadeType.PERSIST, it insert data to groups table too. I want to add date users table and user_group table (pk_user, pk_group)

映射/连接表的工作方式是 user_group会对 user 有一个外键约束和 group table 。这就是为什么 group 中的新行必须插入其主键 以用于将新行添加到user_group .

这与 JPA 无关,即使您使用的是普通 JDBC,这同样适用于您。这就是实体关系在数据库中的工作方式。

Also I dropped all tables and they were generated by eclipse link automatically. They are same but don't insert any row to 'user_group'.

此行为由 eclipselink.ddl-generation 控制为您指定的属性 persistence-unit .当指定为 drop-and-create-tables 时, EclipseLink 重新创建整个数据库模式(删除过程中的任何现有数据)。

<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>

但是,启用此功能只是为了简化您的开发。这不应该在生产环境中使用,在生产环境中通过指定此属性或将其值设置为 none 来禁用它。 .

<property name="eclipselink.ddl-generation" value="none"/>

关于java - JPA多对多持久连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19465662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com