我有一个 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)
持久性单元可以以某种方式包含其他持久性单元吗?或者还有其他方法可以解决这个问题吗?
为了得到RequestFactory
以持续连接的实体,我需要确保我用同样的EntityManager
每个请求.
我根据ThreadLocal
实现拼凑了我自己的Factory类,但我不确定如何正确释放资源(例如,如何知道请求已完成并调用close()
).
是否有一种简单的方法可以确保在给定的ServletRequest中使用单个EntityManager而无需使用完整的J2EE/CDI?如果必须,我会采取这种方式,但我希望保持简单,特别是因为我想继续使用GWT附带的轻量级开发服务器.
我使用的是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 + 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的中期或其他任何此类内容之间没有切换.
谢谢.
使用: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) (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 1
NC_17("NC-17") 异常(和 PG_13("PG-13"),适用于其他值) - 没关系,异常应该读取Data rejected for enum ENUM('G','PG','PG-13','R','NC-17') …
我正在尝试以编程方式创建实体工厂管理器而不使用持久性文件
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的持久性提供程序
我该如何解决这个问题?
任何帮助将不胜感激
我有一个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方法的原因。
是否有不合并但仅更新列表的替代方法?
我已经浏览了许多关于entityManager.flush()方法的主题。在我的实践中,我一直使用persist()和commit()方法。
我还发现,有时flush()在对数据库的选择请求期间自动执行,此时它会检查例如数据库的约束,因此如果由于选择期间的约束而导致持久化对象错误,则会抛出异常。
其实我想明白:
当您执行flush()方法时,持久化数据是否会保存在数据库中?所以你不需要在flush()之后做commit ()吗?
在某些具体情况下,使用flush()而不是commit() 有什么好处?
概述:
我正在构建一个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应该自己处理事务本身。
我已经看过类似问题的答案(例如this,this),但都提出了更改CascadeType的一些变体。
在另一个问题中,有人建议确保该equals()
方法正确评估了有问题的实体,因此我在调试器中签入并((Person)newEntity).currentSite.equals(((Person)newEntity).homeSite)
评估为true。
如何在多个字段中一致地持久保存/合并具有相同对象的实体?
编辑:我也尝试了级联类型与的各种组合fetch = FetchType.EAGER
,但这不会改变它们各自的异常。
编辑2:我尝试使用a JpaRepository
而不是使用EntityManager
,并且根据我使用的层叠类型有效地获得了相同的异常集。
如果我使用PERSIST
,但没有MERGE
,我得到一个EntityNotFoundException
(见堆栈跟踪(4)),如果我同时使用PERSIST
和MERGE
我得到一个InvalidDataAccessApiUsageException`(见堆栈跟踪(5))。
人: …