У меня есть приложение, которое использует Spring, Struts, Hibernate и JPA. Итак, у меня есть две сущности, Компания и Местоположение. Компания находится в одной связи с местоположением, а местоположение во многих семьях - с компанией.
Местоположение объекта:
@Entity<br>
@Table(name = "locations")<br>
@Access(AccessType.PROPERTY)<br>
public class Location implements Serializable, Comparable<Location> {
private Company company;
@ManyToOne
@JoinColumn(name="company_id")
public Company getCompany(){
return this.company;
}
public void setCompany(Company c){
this.company = c;
}
}
Фирма:
@Entity
@Access(AccessType.PROPERTY)
@Table(name = "company")
public class Company implements Serializable {
private Integer id;
private String name;
private List<Location> locations;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(mappedBy="company")
public List<Location> getLocations(){
return this.locations;
}
public void setLocations(List<Location> l){
this.locations = l;
}
public void addLocation(Location l){
if (locations == null)
locations = new ArrayList<Location>();
if (!locations.contains(l))
locations.add(l);
if (l.getCompany()!=this)
l.setCompany(this);
}
public void removeLocation(Location l){
if (locations != null){
if (locations.contains(l))
locations.remove(l);
}
}
}
и затем, когда я хочу добавить новое местоположение, у меня есть метод в locationService:
GenericService:
public abstract class GenericService {
protected Logger logger = Logger.getLogger(getClass());
@PersistenceContext(type = PersistenceContextType.EXTENDED,unitName = "MyPU")
protected EntityManager em;
public void setEntityManager(EntityManager em) {
this.em = em;
}
public EntityManager getEntityManager() {
return em;
}
* *} Тысяча двадцать-один
Служба определения местоположения:
@Transactional
public class LocationServiceImpl extends GenericService implements iLocationService {
@Override
public Boolean saveLocation(LocationForm lf) {
Location l = new Location();
Company c = companyService.getCompany(lf.getCompanyForm().getId());
// set all location properties here from LocationForm Obj
l.setCompany(c);
this.em.persist(l);
c.addLocation(l);
return true;
}
}
Я должен указать, что в качестве пула соединений я использую пул соединений JDBC Glassfish, в котором я включил транзакции с повторяемым уровнем чтения. Теперь все в порядке, но если переключение с повторяемого чтения на сериализуемый метод saveLocation больше не работает.
Это журнал отладки, когда я запускаю saveLocation()
с сериализованным уровнем транзакции:
INFO: DEBUG [http-thread-pool-8080(5)] (SQLStatementLogger.java:111) -
insert
into
locations
(company_id, emailTransfer, liveTransfer, name, outbound_prefix, queue_id, smsTransfer, welcomeMessage)
values
(?, ?, ?, ?, ?, ?, ?, ?)
INFO: DEBUG [http-thread-pool-8080(5)] (SQLStatementLogger.java:111) -
select
locations0_.company_id as company9_153_1_,
locations0_.id as id1_,
locations0_.id as id146_0_,
locations0_.company_id as company9_146_0_,
locations0_.emailTransfer as emailTra2_146_0_,
locations0_.liveTransfer as liveTran3_146_0_,
locations0_.name as name146_0_,
locations0_.outbound_prefix as outbound5_146_0_,
locations0_.queue_id as queue6_146_0_,
locations0_.smsTransfer as smsTrans7_146_0_,
locations0_.welcomeMessage as welcomeM8_146_0_
from
locations locations0_
where
locations0_.company_id=?
Итак, я получаю:
INFO: WARN [http-thread-pool-8080(5)] (JDBCExceptionReporter.java:233) - SQL Error: 1205, SQLState: 41000
INFO: ERROR [http-thread-pool-8080(5)] (JDBCExceptionReporter.java:234) - Lock wait timeout exceeded; try restarting transaction
некоторые части из applicationContext.xml
<bean id="txManagerVA" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emfVA" />
</bean>
<bean id="emfVA" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="vsDS" />
<property name="persistenceUnitName" value="MyPU"/>
</bean>
<jee:jndi-lookup id="vsDS" jndi-name="jdbc/MyJndiDS"/>
<tx:annotation-driven transaction-manager="txManagerVA" />
Кажется, что после этой вставки таблица заблокирована, и никакие другие операции с ней не могут быть выполнены. Как я уже говорил, если я изменю Изоляцию транзакции на Повторимое чтение, все в порядке.
Может кто-нибудь объяснить мне это поведение?
Спасибо