这个问题与Hibernate Annotation Placement Question有些相关.
但我想知道哪个更好?通过属性访问或通过字段访问?各有哪些优缺点?
尽管其他所有人都发布了,但我无法在MacOSX,NetBeans 7.2上找到GlassFish的错误解决方案.
Here the error :
SEVERE: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer
prepare method
SEVERE: Exception while preparing the app
SEVERE: [PersistenceUnit: supmarket] Unable to build EntityManagerFactory
...
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity:
com.supmarket.entity.Sale column: customerId
(should be mapped with insert="false" update="false")
Run Code Online (Sandbox Code Playgroud)
这里的代码:
Sale.java
@Entity
public class Sale {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable=false)
private Long idFromAgency;
private float amountSold;
private String agency;
@Temporal(javax.persistence.TemporalType.DATE)
private Date createdate;
@Column(nullable=false)
private Long productId;
@Column(nullable=false)
private …Run Code Online (Sandbox Code Playgroud) 我有一个分层实体,它将自己引用为父母.我只需要通过id进行映射,而不是通过实体实例进行映射(原因太复杂,无法解释).所以我这样定义了实体:
class Item {
@Id
private String id;
@ManyToOne(targetEntity = Item.class)
@JoinColumn(name = "PARENT_ID", nullable = true)
private String parentId;
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常.在数据库中正确创建外键约束.但是当我执行以下查询时:
SELECT i FROM Item i WHERE i.parentId = :parentId
Run Code Online (Sandbox Code Playgroud)
我得到了这个例外(有趣的部分是粗体):
org.hibernate.PropertyAccessException:调用com.example.dom.Item.id的getter时发生IllegalArgumentException 在org.hibernate.property.BasicPropertyAccessor $ BasicGetter.get(BasicPropertyAccessor.java:192)在org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346)在org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier (AbstractEntityPersister.java:4746)在org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4465)在org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:243)在org.hibernate作为. org.hibernate.type.EntityType.getIdentifier(EntityType.java:537)上的org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:174)中的engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:293) .hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67)位于org.hibernate.loader.Loader.cutePart中的Org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:616)或者org.hibernate.loader.Loader.executeQueryStatement上的org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1901) .java:1862)org.hibernate.loader.Loader.Ladader.doQuery.doQuery.doQueryAndInitializeNonLazyCollections上的org.hibernate.loader.Loader.doQuery(Loader.java:910)中的org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839) Loader.java:355)org.hibernate.loader.Loader.doList(Loader.java:2554)位于org.hibernate.loader.Loader.listIgnoreQueryCache的org.hibernate.loader.Loader.doList(Loader.java:2540) (Loader.java:2370)org.hibernate.loader.Loader.list(Loader.java:2365)位于org.hibernate.hql的org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497). internal.ast.QueryTranslatorImpl.在Org.hibernate的org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)的org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300)中列出(QueryTranslatorImpl.java:387) .internal.QueryImpl.list(QueryImpl.java:103)at com.example.dao.ItemDao.findChildrenByParentId(ItemDao.java:43)at com.example.dao.ItemDao $$ FastClassBySpringCGLIB $$ 51b04ce9.invoke()at org .springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)位于org.springframework.aop.framework.ReflectiveMethodInvocation.proceed的org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) (ReflectiveMethodInvocation.java:157)org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)...还有47个 引起:java.lang.IllegalArgumentException:对象不是 在sun.reflect.DelegatingMethodAccessorImpl的sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)声明类的实例. .invoke(DelegatingMethodAccessorImpl.java:25)位于org.hibernate.property.BasicPropertyAccessor的java.lang.reflect.Method.invoke(Method.java:597)$ BasicGetter.get(BasicPropertyAccessor.java:169)... 76更多
似乎Hibernate正在尝试使用属性parentId,就好像它是Item类型,而不是String类型.
有任何想法吗?
另外请不要建议我使用延迟加载.在我的情况下这是不可行的(再次,太难解释).
假设提供了以下映射:
<class name="A" table="a_table">
<id name="id"/>
<many-to-one name="entityB" column="fk_B" not-null="false" unique="true"/>
</class>
<class name="B" table="b_table">
<id name="id"/>
</class>
Run Code Online (Sandbox Code Playgroud)
Java类:
public class A {
private long id;
private B entityB;
// getters and setters skipped
}
Run Code Online (Sandbox Code Playgroud)
是否可以更改Hibernate映射,以便Hibernate在启动时仍然强制执行和创建外键,但类A看起来如下所示:
public class A {
private long id;
private long idOfB;
// getters and setters skipped
}
Run Code Online (Sandbox Code Playgroud)
我明白,如果我转换<many-to-one...成一个<property...可以工作,但数据库不会强制执行外键.
我需要这样做,因为对象B可能(或可能不)单独初始化,这有时会导致
org.hibernate.LazyInitializationException: could not initialize proxy - no Session在a.getB()调用时发生异常.我宁愿把它作为一个long idOfB并在必要时加载整个对象; 这也可以A …
我正在尝试使用Jackson来(de)将我的JPA实体序列化到JSON或从JSON序列化,以便通过我们的API发布实体状态.FWIW我正在使用hibernate作为JPA提供程序.
我遇到的问题可以用一个简单的一对多的Person to Address示例来说明,如下所示:
@Entity
@Table(name="Person")
public class Person implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
// getters & setters
}
@Entity
@Table(name="Address")
public class Address implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String addressStr;
@ManyToOne
@JoinColumn(name="personId")
private Person person;
// getters & setters
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望能够接受诸如此类的JSON来创建地址请求:
{
"personId": 1,
"addressStr": "123 Somestreet. Fooville, AK. 11111"
}
Run Code Online (Sandbox Code Playgroud)
并使用ObjectMapper创建我的Address实例并保持它.但是,我不知道你有什么方法可以同时拥有与实体的映射关系和它的外键的setter.
非常感谢任何想法或指导!
我的 CSV 文件中有 270000 条记录,其中包含 user_id、book_ISBN 和 book_ rating 列,我需要将这些记录插入到多对多表中。我使用 openCSV 库解析数据,结果是一个列表。
public List<UserRatingDto> uploadRatings(MultipartFile file) throws IOException{
BufferedReader fileReader = new BufferedReader(new
InputStreamReader(file.getInputStream(), "UTF-8"));
List<UserRatingDto> ratings = new CsvToBeanBuilder<UserRatingDto>(fileReader)
.withType(UserRatingDto.class)
.withSeparator(';')
.withIgnoreEmptyLine(true)
.withSkipLines(1)
.build()
.parse();
return ratings;
}
Run Code Online (Sandbox Code Playgroud)
这不存在性能问题,解析大约需要 1 分钟。但是,为了将它们插入到表中,我需要从数据库中获取书籍和用户以形成关系,我尝试使该方法与 @Async 注释异步,我尝试了并行流,我尝试将对象放入放入堆栈并使用 saveAll() 批量插入,但仍然花费太多时间。
public void saveRatings(final MultipartFile file) throws IOException{
List<UserRatingDto> userRatingDtos = uploadRatings(file);
userRatingDtos.parallelStream().forEach(bookRating->{
UserEntity user = userRepository.findByUserId(bookRating.getUserId());
bookRepository.findByISBN(bookRating.getBookISBN()).ifPresent(book -> {
BookRating bookRating1 = new BookRating();
bookRating1.setRating(bookRating.getBookRating());
bookRating1.setUser(user);
bookRating1.setBook(book);
book.getRatings().add(bookRating1);
user.getRatings().add(bookRating1);
bookRatingRepository.save(bookRating1);
});
});
}
Run Code Online (Sandbox Code Playgroud)
这就是我现在所拥有的,有什么我可以改变以使其更快吗?
hibernate ×4
java ×4
foreign-keys ×2
jpa ×2
annotations ×1
bulkinsert ×1
database ×1
java-ee ×1
jpa-2.0 ×1
json ×1
orm ×1
spring-boot ×1
sql-insert ×1