我有两个实体,具有以下JPA注释:
@Entity
@Table(name = "Owner")
public class Owner implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;
@OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL)
@JoinColumn(name="Data_id")
private Data Data;
}
@Entity
@Table(name = "Data")
public class Data implements Serializable
{
@Id
private long id;
}
Run Code Online (Sandbox Code Playgroud)
所有者和数据具有一对一的映射,拥有者是所有者.执行时发生问题:owner.setData(null); ownerDao.update(所有者) ; "Owner"表的Data_id变为null,这是正确的.
但"数据"行不会自动删除.我必须编写另一个DataDao,并用另一个服务层来包装这两个动作(ownerDao.update(owner); dataDao.delete(data);)
当拥有的所有者将其设置为null时,是否可以自动删除数据行?
我想在控制器中使用Spring自动构建Pageable对象.所以我定义:
@RequestMapping("/list")
public String list(Model model , Pageable pageable) {
logger.info("pageable = {}" , pageable);
// ... skipped
}
Run Code Online (Sandbox Code Playgroud)
我定义PageableHandlerMethodArgumentResolver在WebMvcConfigurerAdapter:
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
resolver.setMaxPageSize(10);
resolver.setOneIndexedParameters(true);
argumentResolvers.add(resolver);
}
}
Run Code Online (Sandbox Code Playgroud)
我将页面大小覆盖为10(默认为20),并设置为基于1的分页.运行页面时.我看到日志:
Controller - pageable = Page request [number: 0, size 10, sort: null]
Run Code Online (Sandbox Code Playgroud)
如果我?page=1&size=1在URL中添加参数' ',它仍会打印:
Controller - pageable = Page request [number: 0, size 10, sort: null]
Run Code Online (Sandbox Code Playgroud)
如果我将参数更改为?sort=id,它会记录:
Controller …Run Code Online (Sandbox Code Playgroud) 密封课程:
sealed class Alphabet(val name: String) {
object A : Alphabet("A")
object B : Alphabet("B")
object C : Alphabet("C")
object D : Alphabet("D")
object E : Alphabet("E")
companion object {
val array = arrayOf(A, B, C, D, E)
val list = listOf(A, B, C, D, E)
}
override fun toString(): String {
return name
}
}
Run Code Online (Sandbox Code Playgroud)
还有另一个带有伴侣对象的类:
class AlphabetMap {
companion object {
val map = mapOf(
Alphabet.A to 1,
Alphabet.B to 2,
Alphabet.C to 3,
Alphabet.D to 4,
Alphabet.E …Run Code Online (Sandbox Code Playgroud) 我的问题非常类似于:通过Spring将字段注入Hibernate加载的实体
不同之处在于,我使用的是JPA2实体,而不是hibernate.虽然底层仍然处于休眠状态(3.5.5).
我的春季版是3.0.4.
eventListenersJPA的世界中有什么相应的?
原帖的示例代码:
class Student {
int id; //loaded from DB
String name; //loaded from DB
int injectedProperty; //Inject via Spring
transient Service serviceImpl; //Inject via Spring
}
Run Code Online (Sandbox Code Playgroud)
我知道可能有aspectJ的解决方案,但我更喜欢纯java解决方案.谢谢.
我知道这经常被问到,但我找不到一个有效的解决方案:
这是我的AbstractDAO:
public interface AbstractDao<T>
{
public T get(Serializable id);
//other CRUD operations
}
Run Code Online (Sandbox Code Playgroud)
这是我的JPA实现:
public abstract class AbstractDaoJpaImpl<T> implements AbstractDao<T> , Serializable
{
protected EntityManager em;
protected Class<T> clazz;
@SuppressWarnings("unchecked")
public AbstractDaoJpaImpl()
{
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
this.clazz = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
}
public abstract void setEntityManager(EntityManager em);
//implementations skipped
}
Run Code Online (Sandbox Code Playgroud)
这是一个实体的道:
public interface PersonDao extends AbstractDao<Person>
{
//empty
}
Run Code Online (Sandbox Code Playgroud)
这是它的实现:
@Repository
public class PersonDaoImpl extends AbstractDaoJpaImpl<Person> implements PersonDao , OtherInterface
{
@PersistenceContext(unitName="company")
@Override
public void setEntityManager(EntityManager em)
{ …Run Code Online (Sandbox Code Playgroud) 我在JPA中存储了一个Map,它存储了每种语言的关键字翻译.比如一个对象商店Locale.ENGLISH -> "Father" , Locale.CHINESE -> "PaPa".另一个对象存储Locale.ENGLISH -> "Mother" , Locale.CHINESE -> "MaMa";
这是我的工作设计:
public class Relation {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ElementCollection
@MapKeyColumn(name="locale")
@Column(name="value")
@CollectionTable(name = "RelationName", joinColumns = @JoinColumn(name = "relation_id"))
private Map<Locale, String> langMap = new HashMap<>();
// other fields skipped
}
Run Code Online (Sandbox Code Playgroud)
它运行良好,我可以存储许多关键字翻译到DB.但是当用JPQL查询时,它有一些问题:
例如,我想找到哪个Relation的英文键值为"Father":
这是我的代码:
Relation r = em.createQuery("select r from Relation r join r.langMap m where ( KEY(m) = :locale and VALUE(m) = :value ) " , Relation.class)
.setParameter("locale" …Run Code Online (Sandbox Code Playgroud) 如果我有一个Observalbe:
List<Integer> ints = Lists.newArrayList(1, 2, 0, 3, 4);
Observable<Integer> o1 = Observable.from(ints);
Run Code Online (Sandbox Code Playgroud)
我想生成另一个可观察的,除以12:
Observable<Integer> o2 = o1.map(i -> 12/i);
o2.subscribe(
v -> logger.info ("Subscriber value {}", v) ,
t -> logger.error("Subscriber onError {} : {}", t.getClass() , t.getMessage())
);
Run Code Online (Sandbox Code Playgroud)
很明显它会出错,并在遇到'0'时停止:
RxTest - Subscriber value 12
RxTest - Subscriber value 6
RxTest - Subscriber onError class java.lang.ArithmeticException : / by zero
Run Code Online (Sandbox Code Playgroud)
但是,如果我希望Observer(o2)跳过异常呢?
我查看了RxJava关于错误处理的文档,没有办法跳过错误.在onErrorResumeNext()和onExceptionResumeNext()需要备份/回退 Observable,这不是我想要的.在onErrorReturn需要指定返回值.
所有三种错误处理方法都无法恢复原始观察者.例如 :
Observable<Integer> o2 = o1.map(i …Run Code Online (Sandbox Code Playgroud) 医生说
从概念上讲,它是Single和Completable的联合,提供捕获排放模式的方法,其中可能存在0或1项或由某些反应源发出的错误信号.
但我不确定它的真正含义.它似乎是java8的Optional.
以下两个代码具有相同的结果,但我不知道Maybe可以做什么和Optional不能(或繁琐)做什么.
@Test
public void testMaybe1() {
Observable.just(3, 2, 1, 0, -1)
.map(i -> {
try {
int result = 6 / i;
return Maybe.just(result);
} catch (Exception e) {
return Maybe.empty();
}
})
.blockingForEach(maybe -> {
logger.info("result = {}", maybe.blockingGet());
}
);
}
@Test
public void testMaybe2() {
Observable.just(3, 2, 1, 0, -1)
.map(i -> {
try {
int result = 6 / i;
return Optional.of(result);
} catch (Exception e) { …Run Code Online (Sandbox Code Playgroud) 这是我第一次尝试Spring3的@Scheduled,但发现我无法承诺DB.这是我的代码:
@Service
public class ServiceImpl implements Service , Serializable
{
@Inject
private Dao dao;
@Override
@Scheduled(cron="0 0 * * * ?")
@Transactional(rollbackFor=Exception.class)
public void hourly()
{
// get xxx from dao , modify it
dao.update(xxx);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为它应该工作,我可以看到它每小时启动并从DB加载xxx,但数据不会提交给DB.
有许多人tx:annotation-driven在春天的XML:
<bean id="entityManagerFactoryApp" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myapp"/>
</bean>
<bean id="transactionManagerApp" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactoryApp" />
</bean>
<tx:annotation-driven transaction-manager="transactionManagerApp" />
Run Code Online (Sandbox Code Playgroud)
有人能告诉我我错过了什么吗?
我有一个' 脏 '的解决方案:
@Service
public class ServiceImpl implements Service , Serializable
{
@Inject
private Dao dao;
@Inject
@Qualifier("transactionManagerApp")
private PlatformTransactionManager …Run Code Online (Sandbox Code Playgroud) spring dependency-injection scheduling transactional spring-3
我有一个程序,getClass().getClassLoader().getResource()用于获取目录的URL,它在eclipse中工作正常,但在jared之后,它返回null.
根据这个网址:http: //www.coderanch.com/t/385935/java/java/getResource-path-fails-Jar
问题的结果是因为jar中不存在路径本身.存在路径的文件,但不存在路径本身.我在Eclipse中使用"Runnable JAR File"导出命令.当我尝试使用旧的导出"Jar文件"来创建jar时,我注意到" 添加目录条目 " 的复选框,这就是解决方案.Jar文件在jar中需要自己的目录条目,getResource()返回路径的URL.
但是在maven中,我无法在打包时找到"添加目录条目"的命令,有人可以给我一个提示吗?非常感谢 !
环境:eclipse 3.5,m2eclipse,maven 2.2.1
java ×5
spring ×4
hibernate ×3
jpa ×3
rx-java ×2
cglib ×1
genericdao ×1
getresource ×1
jar ×1
jpql ×1
kotlin ×1
mysql ×1
one-to-one ×1
optional ×1
orm ×1
rx-java2 ×1
scheduling ×1
spring-3 ×1
spring-mvc ×1