当前位置: 首页 > 知识库问答 >
问题:

Java,Hibernate--使用单独的嵌入式键类持久化实体后无法检索id

程俊誉
2023-03-14

我正在开发一个样例Springboot服务器应用程序,并使用hibernate for JPA。我使用一个通用的存储库模式,在我的实体上执行所有的CRUD操作。我在遵循这个例子:http://www . concrete page . com/spring-boot/spring-boot-rest-JPA-hibernate-MySQL-我碰到的例子。(我的想法是拥有一个通用的存储库,对于所有的CRUD操作有一个相似的实现,而不是在每个服务/DAO或存储库实现中为每个实体显式地声明一个)。因此,我能够持久化一个实体,并且id将反映在< I > entitymanager . persist(object)之后的对象中

在我的代码中,我将Key类分开,并在Entity类中引用它。在EntityManager上调用持久化时,会在数据库中创建一行(因为主键的列在数据库中设置为自动递增),但在调用持久化()后,相同的ID不会反映在对象中。在任何时候,我在键类中的ID属性都设置为0,这是默认的int值。我想知道是否有办法可以通过会话或EntityManager获取插入对象的ID。还有没有任何替代策略来解决这个问题,而不需要在Entity类本身中包含主键。(到目前为止,我已经看了多篇关于SO的文章,但还没能找到我的问题的解决方案。)

实体类

@Entity
@Table(name = "articles")
public class SampleArticle extends AbstractDomainObject {
/** The serialVersionUID. */
private static final long serialVersionUID = 7072648542528280535L;
/** Uniquely identifies the article. */
@EmbeddedId
@AttributeOverride(name = "articleId", column = @Column(name = "article_id"))
@GeneratedValue(strategy = GenerationType.IDENTITY)
//@GeneratedValue(strategy = GenerationType.AUTO)
private SampleArticleKey key;
/** Indicates the title. */
@Column(name = "title")
private String title;

关键字分类

@Embeddable
public class SampleArticleKey extends AbstractDomainKey {
/**
 * Serial version id.
 */
private static final long serialVersionUID = 1325990987094850016L;
/** The article id. */
private int articleId;

存储库类

@Repository
@Transactional
public class SampleArticleRepository extends 
AbstractRepository<SampleArticle, SampleArticleKey> implements 
ISampleArticleRepository<SampleArticle, SampleArticleKey> {
/*
 * (non-Javadoc)
 * @see
 * com.wpi.server.entity.repository.ISampleArticleRepository#addArticle
 * (java.lang.Object)
 */
@Override
public SampleArticle create(SampleArticle article) throws Exception {
    return super.create(article);
}

抽象知识库

@Transactional
public abstract class AbstractRepository<T extends AbstractDomainObject, K 
extends AbstractDomainKey> {
/** The entity manager. */
@PersistenceContext
private EntityManager entityManager;
/** The Constant LOGGER. */
private static final Logger LOGGER = Logger.getLogger(AbstractRepository.class.getName());

/**
 * Persist the given object at persistence storage.
 *
 * @param object
 *            The object extending {@link AbstractDomainObject} which needs
 *            to be inserted.
 * @return object of type {@link AbstractDomainObject} with the newly
 *         generated id.
 * @throws Exception
 *             If unable to insert data.
 */
public T create(T object) throws Exception {
    final Session session = entityManager.unwrap(Session.class);
    session.getTransaction().begin();
    session.save(object);
    session.flush();
    session.getTransaction().commit();
    session.close();
    LOGGER.fine("Entity CREATED successfully.");
    return object;
};

共有1个答案

孔逸春
2023-03-14

让我给你一个工作可嵌入的密钥示例。它可能会有所帮助。首先覆盖 equals() 和 hashCode() 方法,以便 Hibernate 正确识别现金中的对象。

现在,您可以持久化对象了

如果这有帮助,或者您有其他问题,请告诉我。

 类似资料:
  • 持久化类(Persistent Object )简称 PO,在 Hibernate 中, PO 是由 POJO(即 java 类或实体类)和 hbm 映射配置组成。 简单点说,持久化类本质上就是一个与数据库表建立了映射关系的普通 Java 类(实体类),例如 User 类与数据库中 user 表通过映射文件 User.hbm.xml 建立了映射关系,此时 User 就是一个持久化类。 持久化类的规

  • 问题内容: 我正在尝试将实体扩展为用于填充超类字段的非实体。问题是,当我尝试保存它时,Hibernate会抛出MappingException。这是因为即使我将ReportParser强制转换为Report,但运行时实例仍然是ReportParser,因此Hibernate抱怨它是一个未知的实体。 ReportParser仅用于填写字段。 尝试将其投射到报告中并保存 在转移到ORM之前,我已经使用

  • 问题内容: 我有一个托管bean,其中包含当前页面的实体对象列表。在我创建一个新对象并在事务中使用persist()将其持久保存到数据库之后;在另一个事务中,当我调用merge时(由于该实体由于先前的事务提交而处于分离状态);实体管理器无法在持久性上下文中找到对象,并向数据库抛出选择查询。我是否缺少某些东西,或者是正常行为? 更新:当我使用mysql数据库和自动生成的ID列时,存在上述问题。当我在

  • 尝试获取父实体(Msg)的实体,其中父PK (msg_id)是子实体中的FK时,尝试保持子实体(MsgRetry)时出错。 错误,如:org.hibernate.id.IdentifierGenerationException:试图从null一对一属性分配id 父实体,不需要知道子实体(至少我认为它不需要知道)。一旦子实体被持久化,我就会尝试也持久化父实体。我可以通过在子实体中没有父实体并调用关联

  • 我已经在这个问题上工作了两天了,现在我没有主意了。 下面是entity和dao类: 抽象性: 域道: 我不认为问题出在EntityManager或dao类中,因为EntityManager(find())至少有一个方法起作用。我会很感激和帮忙的。

  • 我是Spring靴的初学者,不能解决问题。我有一个实体类(Customer)和一个REST存储库(CustomerRepository)。类包含一些我不想被REST存储库公开的敏感字段。因此,我使用@jsonIgnore注释对这些字段进行了注释,如下所示: 一切正常,我的REST API返回了所需的结果。但是,当我向API发出POST请求以插入新实体时,我会收到数据库错误:。 在POST请求中,密