gpt4 book ai didi

java - JPA 从数据库中创建、编辑和删除实体

转载 作者:行者123 更新时间:2023-12-01 09:48:18 28 4
gpt4 key购买 nike

我应该如何尽可能简单地管理实体的创建、编辑和删除操作?

例如:

用户:

public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String name;

...

// Item can't exist without user
@OneToMany(cascade=CascadeType.ALL,mappedBy = "user",orphanRemoval=true)
private Set<Item> items = new HashSet<Item>();

public Set<Item> getItems() { return items; }

public void addItem(Item item) {
items.add(item);
}

public void removeItem(Item item) {
if(!items.contains(item)) return;
items.remove(item);
}

// Group can exist without a user
@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH},mappedBy="users")
private Set<Group> groups = new HashSet<Group>();

public Set<Group> getGroups() { return groups; }

public void setGroups(Set<Group> groups) { this.groups = groups; }

public void addGroup(Group group) {
groups.add(group);
}

publi void removeGroup(Group group) {
if(!groups.contains(group)) return;
groups.remove(group);
}

...
}

组:

@Entity
public class Group {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String name;

...

@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinTable(name = "GroupToUser", joinColumns =
@JoinColumn(name = "GroupId", referencedColumnName="Id"), inverseJoinColumns =
@JoinColumn(name = "UserId", referencedColumnName="Id"))
private Set<User> users = new HashSet<User>();

public Set<User> getUsers() { return users; }

public void setUsers(Set<User> users) { this.users = users; }

public void addUser(User user) {
user.addGroup(this);
}

publi void removeUser(User user) {
if(!users.contains(user)) return;
users.remove(user);
}

...
}

项目:

@Entity
public class Item {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String name;

...

@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name="UserId")
private User user;

public Set<User> getUser() { return user; }

public void setUser(User user) {
this.user = user;
}

publi void removeUser() {
this.user = null;
}

...
}

我使用的 jpa 注释正确吗?

这里应该写什么?

EntityManager em = getEntityManager();
em.getTransaction().begin();
???
em.getTransaction().commit();

我是否必须调用 em.remove/persist/merge 方法来进行删除/创建/编辑操作?

什么时候应该在这些操作中使用 javax.persistence.EntityManager.getReference 方法?

最佳答案

Find() 从持久化上下文的缓存中传递实体,如果不存在,则从数据库中加载实体。

GetReference() 不会立即加载实体。返回一个代理(某个对象,所谓的“代理”,具有用于加载实际实体的丰富方法)。所以这是借助LazyLoading来实现的。

仅当需要/调用代理的属性或其他持久性方法时,代理才会交互并从数据库加载实际实体。

例如:

User us = em.find(User.class, 70992);

GetReference() 的用法类似。

 User us = em.getReference(User.class, 70922);

如果持久化上下文中未知用户 ID 的实体,则会抛出 EntityNotFoundException()。

当我不需要访问数据库状态时,我通常使用 getReference 方法(我的意思是 getter 方法)。只是为了改变状态(我的意思是setter方法)。

在上面的情况下,如果我想在获取用户后更新用户的年龄,如下所示:

setAge(age);

如果我调用 find 方法,JPA 提供程序将在幕后调用

SELECT NAME, AGE FROM USER WHERE USER_ID = ?

UPDATE USER SET AGE = ? WHERE USER_ID = ?

如果我调用 getReference 方法,JPA 提供程序将在幕后调用

UPDATE PERSON SET AGE = ? WHERE USER_ID = ?

因为当你调用getReference时,你会得到一个代理对象。

对于其余部分,我们必须像您所说的那样使用删除、持久和合并

关于java - JPA 从数据库中创建、编辑和删除实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37800546/

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