标签: entitymanager

EclipseLink、EntityManager 需要两个持久性单元

我有一个 jar 库 A(或 eclipse 中的项目),它有自己的持久性单元(META-INF/persistence.xml)和一些实体类,以及使用该库的另一个项目(B)。在项目 B 中还有持久化单元和实体类。

在项目 BI 中,需要使用项目 A 和 B 中的两个实体类。但是,如果我将“A”设置为持久性单元名称,则 EntityManager 无法创建命名查询(如果该查询位于项目 B 的实体中)。如果我将“B”设置为持久性,则 EntityManager 无法创建命名查询。单位名称,它无法从项目 A 的实体创建命名查询。错误消息是:

NamedQuery of name: MyEntityName.myQueryName not found.
Run Code Online (Sandbox Code Playgroud)

持久性单元可以以某种方式包含其他持久性单元吗?或者还有其他方法可以解决这个问题吗?

jpa entitymanager eclipselink

3
推荐指数
1
解决办法
4972
查看次数

GWT RequestFactory:如何在每个请求中使用单个EntityManager

为了得到RequestFactory持续连接的实体,我需要确保我用同样的EntityManager每个请求.

我根据ThreadLocal实现拼凑了我自己的Factory类,但我不确定如何正确释放资源(例如,如何知道请求已完成并调用close()).

是否有一种简单的方法可以确保在给定的ServletRequest中使用单个EntityManager而无需使用完整的J2EE/CDI?如果必须,我会采取这种方式,但我希望保持简单,特别是因为我想继续使用GWT附带的轻量级开发服务器.

gwt code-injection entitymanager cdi requestfactory

3
推荐指数
1
解决办法
3400
查看次数

如何使用多个数据源设置spring数据jpa

我使用的是Spring Data Jpa版本1.0.0.M2这里是网址:http://static.springsource.org/spring-data/data-jpa/docs/1.0.0.M2/reference/pdf/spring-data -jpa-参考.pdf

所有这些都被认为非常简单和漂亮,但是当涉及到两个数据源时,它就会崩溃.问题是如何设置两个数据源?JpaRepository会自动搜索EntityManager,当它找到两个以上时会抛出异常.

如果您对EntityManager有任何想法以及如何设置弹簧数据jpa,请发表回复.真的很感谢你的帮助!

spring jpa unique entitymanager spring-data

3
推荐指数
1
解决办法
1万
查看次数

Spring + Hibernate + JPA +多个数据库

我有一个Spring + Hibernate + JPA应用程序.登录时,用户可以从要连接的DB列表中进行选择(这些是要求).所有数据库都具有相同的模式,因此将使用相同的实体和DAO.

现在我有一个EntityManager(目前正在使用一个数据库),它注入DAO,如下所示:

@PersistenceContext
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)

有没有办法让DAO根据从服务层接收的参数/属性自动接收entityManager(由Spring管理)?(Web层发送一种上下文,所选数据库的名称/代码/ id将在那里).

或者我必须自己管理(创建所有的entityManagers,将它们放在一张地图中,告诉DAO每个调用使用哪一个)?

我在问这个问题之前做了一些研究,但结果没有结果 - 大多数问题涉及的模型分布在2个或更多DB以及跨越多个DB的事务中,但对我来说情况并非如此.

在我的情况下,一旦用户连接,就好像他连接到只有一个实体管理器的应用程序,即他选择的数据库.DB的中期或其他任何此类内容之间没有切换.

谢谢.

spring hibernate jpa entitymanager multiple-databases

3
推荐指数
1
解决办法
8513
查看次数

传递给持久化的分离实体

使用:hibernate 3.6.10,maven 2,postgres 9。我有必须工作的代码,但它没有。在我使用 hibernate 3.6.2 并得到非常沮丧的错误之前:java.lang.ClassCastException: org.hibernate.action.DelayedPostInsertIdentifier cannot be cast to java.lang.Long

但是在更新到 3.6.10 之后错误变得更加合理:javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity传递给持久化

代码是一个标准的领域模型:

实体:

@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@Entity
@Table(schema = "simulators", name = "mySimulator_card")
public class MySimulatorCard {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "account_number", unique = true, nullable = false)
    private String accountNumber;
Run Code Online (Sandbox Code Playgroud)

等等...

道:

public abstract class AbstractDao<E, PK extends Serializable> implements Dao<E, PK> {

    private EntityManager entityManager;

    public EntityManager getEntityManager() {
        return entityManager;
    } …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate entitymanager detach

3
推荐指数
1
解决办法
5368
查看次数

实体管理器 @Enumerated(EnumType.STRING) - 如何让它使用 toString()?

(MySQL) 数据库中的评级列具有类型ENUM('G','PG','PG-13','R','NC-17')(注意破折号)。这:

@Entity
@Table(name = "movies")
public class Movie implements Serializable {

    @Enumerated(EnumType.STRING)
    private Rating rating;

    public static enum Rating {
        G("G"), NC_17("NC-17"), R("R"), PG("PG"), PG_13(
                "PG-13");

        private String label;

        private Rating(String label) {
            this.label = label;
        }

        public String getLabel() {
            return label;
        }

        @Override
        public String toString() { // added but still
            return label;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

导致Data truncated for column 'rating' at row 1NC_17("NC-17") 异常(和 PG_13("PG-13"),适用于其他值) - 没关系,异常应该读取Data rejected for enum ENUM('G','PG','PG-13','R','NC-17') …

java enums ejb entitymanager ejb-3.0

3
推荐指数
1
解决办法
1万
查看次数

以编程方式创建实体管理器而不持久化文件

我正在尝试以编程方式创建实体工厂管理器而不使用持久性文件

    EntityManagerFactory emf;
    Map<String, String> properties = new HashMap<String, String>();
    properties.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
    properties.put("hibernate.connection.url", "jdbc:mysql://173.194.25***************");
    properties.put("hibernate.connection.username", "etech****");
    properties.put("hibernate.connection.password", "A*****");
    properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
    properties.put("hibernate.show-sql", "true");
    properties.put("provider", "org.hibernate.ejb.HibernatePersistence");
    emf = Persistence.createEntityManagerFactory(idClient, properties);
Run Code Online (Sandbox Code Playgroud)

在线

emf = Persistence.createEntityManagerFactory(idClient, properties);
Run Code Online (Sandbox Code Playgroud)

我收到错误:

org.springframework.beans.factory.BeanCreationException:创建名为'com****RepositoryFieldsFieldWorkerRepositoryImpl'的bean时出错:init方法的调用失败; 嵌套异常是javax.persistence.PersistenceException:没有名为idClient的EntityManager的持久性提供程序

我该如何解决这个问题?

任何帮助将不胜感激

java entity hibernate entitymanager eclipselink

3
推荐指数
2
解决办法
2万
查看次数

JPA一对多关系更新列表

我有一个Question实体,其中包含另一个名为Alternatives的实体,如下所示:

public class Question {
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "question", cascade = CascadeType.ALL)
    @JsonManagedReference
    private List<Alternative> alternativeList;
}

public class Alternative implements Serializable {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "questionId", nullable = false)
    @JsonBackReference
    private Question question;

}
Run Code Online (Sandbox Code Playgroud)

然后,我想用一组新的“替代”列表更新一个退出的“问题”条目。为此,我用新的Question对象调用了JpaDao元素的merge方法:

@Repository
public class JpaQuestionDao implements QuestionDao {
    @PersistenceContext
    private EntityManager em;

    @Transactional
    public Question update(Question question) {
        return em.merge(question);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这实际上是合并两个列表:一个已经在数据库中,另一个是新提供的。当我有非列表对象时,这种方法没有任何问题,这就是为什么我一直使用merge方法的原因。

是否有不合并但仅更新列表的替代方法?

merge hibernate jpa entitymanager

3
推荐指数
1
解决办法
1万
查看次数

实体管理器。Flush() 是否将数据库中的数据保存为 Commit()?

我已经浏览了许多关于entityManager.flush()方法的主题。在我的实践中,我一直使用persist()commit()方法。

我还发现,有时flush()在对数据库的选择请求期间自动执行,此时它会检查例如数据库的约束,因此如果由于选择期间的约束而导致持久化对象错误,则会抛出异常。

其实我想明白:

  1. 当您执行flush()方法时,持久化数据是否会保存在数据库中?所以你不需要在flush()之后做commit ()吗?

  2. 在某些具体情况下,使用flush()而不是commit() 有什么好处?

java jpa entitymanager

3
推荐指数
1
解决办法
5412
查看次数

如何使用spring-boot和JPA持久化包含另一个未持久实体的多个相同实例的新实体?

概述:

我正在构建一个spring-boot应用程序,该应用程序的一部分是从外部REST服务检索一些实体,并将其与数据库中本地保存的实体的先前版本进行比较。

我注射EntityManager@PersistenceContext,并用它来工作与数据库,因为有许多实体类型,类型最初是未知的模块。我可以JpaRepository从工厂获得,但是不同实体类型的数量容易增加,如果可能的话,我宁愿不依赖它。

问题:

当模块检索它不在数据库中的实体时,它将执行一些业务逻辑,然后尝试保留新实体。

Person班,这是有问题的实体之一,包含类型的三个领域Site,这往往持有相同的对象。

当我尝试使用持久保存一个在多个字段中具有Person相同Site对象的新对象时CascadeType.PERSIST,我得到了一个EntityExistsException(请参阅stacktrace(1))。

当我从Site字段中删除CascadeType.PERSIST 并尝试在多个字段中保留Person具有相同Site对象的新对象时,我得到了TransientPropertyValueException(请参见stacktrace(2))。

我想我了解两种例外情况发生的原因:

  • 在第一种情况下,是因为在第一个站点字段被级联持久化之后,它无法在第二个字段中重新持久化。

  • 我认为的第二种情况是因为@Transactional注释正在尝试在不持久化站点实例的情况下刷新事务。

我尝试删除@Transactional注释并自己开始并提交EntityTransaction,但我得到了一个IllegalStateException(请参阅stacktrace(3)),尽管我认为这是可以预期的,因为spring应该自己处理事务本身。

我已经看过类似问题的答案(例如thisthis),但都提出了更改CascadeType的一些变体。

在另一个问题中,有人建议确保该equals()方法正确评估了有问题的实体,因此我在调试器中签入并((Person)newEntity).currentSite.equals(((Person)newEntity).homeSite)评估为true。

如何在多个字段中一致地持久保存/合并具有相同对象的实体?


编辑:我也尝试了级联类型与的各种组合fetch = FetchType.EAGER,但这不会改变它们各自的异常。


编辑2:我尝试使用a JpaRepository而不是使用EntityManager,并且根据我使用的层叠类型有效地获得了相同的异常集。

如果我使用PERSIST,但没有MERGE,我得到一个EntityNotFoundException(见堆栈跟踪(4)),如果我同时使用PERSISTMERGE我得到一个InvalidDataAccessApiUsageException`(见堆栈跟踪(5))。


人: …

java jpa cascade entitymanager persist

3
推荐指数
1
解决办法
1214
查看次数