我是Spring和冬眠的新手,遇到了一个几天都解决不了的问题。
在我的项目中,我在服务器和用户实体之间使用多对多关系。一个用户可以存在于多个服务器上。
我的想法是:服务器
创建表的代码:
CREATE TABLE public.servers (
id bigint NOT NULL,
s_snowflake bigint NOT NULL,
name character varying(64) NOT NULL
);
CREATE TABLE public.users (
id bigint NOT NULL,
u_snowflake bigint NOT NULL,
name character varying(64) NOT NULL
);
CREATE TABLE public.server_users (
id bigint NOT NULL,
server_id bigint NOT NULL,
user_id bigint NOT NULL
);
这是我的课程的样子:
@Entity
@Table(name = "servers")
public class Server {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "s_snowflake", unique = true)
private long snowflake;
private String name;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(
name = "server_users",
joinColumns = @JoinColumn(name = "server_id"),
inverseJoinColumns = @JoinColumn(name = "user_id")
)
private Set<User> users = new HashSet<>();
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "u_snowflake", unique = true)
private long snowflake;
private String name;
@ManyToMany(mappedBy = "users", targetEntity = Server.class, fetch = FetchType.EAGER)
private Set<Server> servers = new HashSet<>();
}
当我初始化数据时,这很有效。我创建了一个服务器对象,并在其中填充了用户,所有内容都正确保存了。
但是当我试图保存一个包含已经在users表中的用户的服务器时,我遇到了问题(如果我从数据库中级联删除服务器,用户应该不会被删除)。
有没有办法配置Hibernate,以便在必要时添加新用户,但如果用户存在,则使用Server_Users表将其与新服务器“创建关系”?
我试着把卡斯特放进去。SAVE_UPDATE和其他方法,但没有结果。
上瘾:
这是我用来保存和更新的DAO类方法:
public abstract class AbstractDAOImpl<T> implements AbstractDAO<T> {
public void save(T entity) {
Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
Transaction trx = session.beginTransaction();
session.save(entity);
trx.commit();
session.close();
}
public void update(T entity) {
Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
Transaction trx = session.beginTransaction();
session.update(entity);
trx.commit();
session.close();
}
}
服务器添加逻辑。首先,我将它保存到数据库中,然后用用户填充该集合,并执行< code>update()如果包含用户的表为空,则在Server_users和Users表中创建所有必要的记录和连接:
public static void addServer(Guild guild) {
Server server = new Server(Long.parseLong(guild.getId()), guild.getName());
serverDAO.save(server);
for (Member m : guild.getMembers()) {
User user = new User(Long.parseLong(m.getId()), m.getUser().getName());
user.addServer(server);
server.addUser(user);
}
serverDAO.update(server);
}
我找到了解决办法
@Cascade({
org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.MERGE,
org.hibernate.annotations.CascadeType.PERSIST
})
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "server_users",
joinColumns = @JoinColumn(name = "server_sn"),
inverseJoinColumns = @JoinColumn(name = "user_sn")
)
private Set<User> users = new HashSet<>();
我在服务器和用户代码SAVE_UPDATE添加了级联类型,合并和持久化
此外,我重新设计了基础的架构,将雪花作为主键,因为值始终是唯一的。
我是Hibernate的新手,并要求使用具有这些列的表的数据库 表:TBL _ product//库存项目列表< br >列:< br > key _ product < br > key _ category < br > fld _ product _ name < br > fld _ Inventory _ qty < br > fld _ unit _ price < br > fld
我有一个实体CandidateTransaction和CandidateTransactionRepository扩展了CrudRepository 我正在使用CrudRepository的save方法来保存所述实体的对象。当实体没有行时,它将创建一个自动生成的键并将其插入ID列,而不需要Java端的干预。 而且,由于CrudRepository的save()方法检查实体是否是新的,如果是新的,它
我在用户和角色之间有多对多的关系 用户实体: 角色实体: 用户角色实体: 服务等级: 样本输入: 1:首次储蓄-成功 示例输入2:向同一用户保存其他角色-失败 异常:(尝试在链接实体中的用户和角色中插入null) 在用户实体的映射或实用方法中是否缺少某些内容。非常感谢您的帮助。
嗨,我有一个角色表和一个权限表,它有多对多的关系。我已经创建了下面链接中提到的实体 https://www.baeldung.com/jpa-多对多 角色实体 权限实体 我已经为每个实体创建了JPA存储库,并且正在尝试将权限保存给一个角色。我在表中已经有了一组/列表的权限,我正在尝试将它们映射到某个角色。我正在尝试使用spring JPA存储库执行下面的代码。 在执行我得到的代码时 org.hib
问题内容: 我已经使用gps设备捕获了一个图的四个点(坐标)。 点1:-lat- 27.54798833长-80.16397166 点2:-lat 27.547766,长-80.16450166 点3:-lat 27.548131,长-80.164701 点4:---- 现在我想将这些坐标保存在oracle数据库中,并将其另存为多边形。 谢谢 问题答案: 如果打算使用Oracle Spatial来
我正在尝试开发一个小型电子商务项目。我有一个篮子和篮子项目实体。我只是想当我为客户保存购物篮时,我想把购物篮项目保存在数据库中。我认为我不应该为篮子项目创建存储库。我应该能够保存篮子项目,同时使用篮子存储库保存篮子。 在这里,我试图通过篮子服务获得一个篮子项目,并将其设置为篮子实体并保存它。 我有什么问题?我有个例外。