小编Rob*_*Rob的帖子

Hibernate一对一:getId()而不提取整个对象

我想在不加载整个对象的情况下获取一对一关系的id.我以为我可以使用延迟加载执行此操作,如下所示:

class Foo { 
    @OneToOne(fetch = FetchType.LAZY, optional = false)
    private Bar bar; 
}


Foo f = session.get(Foo.class, fooId);  // Hibernate fetches Foo 

f.getBar();  // Hibernate fetches full Bar object

f.getBar().getId();  // No further fetch, returns id
Run Code Online (Sandbox Code Playgroud)

我希望f.getBar()不会触发另一个提取.我希望hibernate给我一个代理对象,允许我调用.getId()而不实际获取Bar对象.

我究竟做错了什么?

java hibernate jpa

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

Emacs:.emacs中延迟加载模式的最佳实践?

遇到相关文件扩展名时,是否有关于延迟加载模式的最佳做法?

此时我安装了大约25种不同的Emacs模式,启动变慢.例如,尽管准备好clojure模式很棒,但我很少使用它,除非我打开扩展名为.clj的文件,否则我想避免加载它.这种"懒惰的需求"功能似乎是正确的模式配置方式.

我在网上找不到任何东西,所以我自己也搞砸了.

代替:

(require 'clojure-mode)
(require 'tpl-mode) 
Run Code Online (Sandbox Code Playgroud)

我有这个:

(defun lazy-require (ext mode)
  (add-hook
   'find-file-hook
   `(lambda ()
      (when (and (stringp buffer-file-name)
                 (string-match (concat "\\." ,ext "\\'") buffer-file-name))
        (require (quote ,mode))
        (,mode)))))

(lazy-require "soy" 'soy-mode)
(lazy-require "tpl" 'tpl-mode)
Run Code Online (Sandbox Code Playgroud)

这似乎工作(我是一个elisp新手,所以欢迎评论!),但我对在网上找不到关于这个主题的书面感到不安.这是一种合理的方法吗?

emacs clojure dot-emacs

10
推荐指数
1
解决办法
1869
查看次数

Hibernate:安全地将对象重新附加到会话中

我通过在地图中存储(可能是分离的)对象来维护hibernate会话中的对象缓存.当缓存命中时,我测试对象是否已经是会话的一部分Session.contains(object).如果没有,我重新附上它Session.lock(object, LockMode.NONE).

问题是,如果先前在会话中加载了相同的对象,则会抛出org.hibernate.NonUniqueObjectException.给定一个分离的实例,我认为没有办法提前找出是否会抛出此异常,而不会触及数据库.

有几种解决方法:

  1. 在每个事务开始时重新附加所有缓存的对象.
  2. 捕获NonUniqueObjectException,然后调用session.load(object.class,object.getId());

这些都不像预先检查对象类+ id的会话一样干净.

有没有办法做到这一点?

java hibernate

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

Django - Celery:@transaction和@task不叠加

我想用手动事务管理来运行Django-Celery任务,但似乎注释没有堆栈.

例如

def ping():
    print 'ping'
    pong.delay('arg')

@task(ignore_result=True)
@transaction.commit_manually()
def pong(arg):
    print 'pong: %s' % arg
    transaction.rollback()
Run Code Online (Sandbox Code Playgroud)

结果是

TypeError: pong() got an unexpected keyword argument 'task_name'
Run Code Online (Sandbox Code Playgroud)

而反向注释顺序导致

---> 22     pong.delay('arg')

AttributeError: 'function' object has no attribute 'delay'
Run Code Online (Sandbox Code Playgroud)

这很有道理,但我找不到一个好的解决方法.Django文档没有提到注释的替代品,我不想在不需要的时候为每个芹菜任务创建一个类.

有任何想法吗?

django celery django-celery

5
推荐指数
2
解决办法
3427
查看次数

YouTube JS API:检测"嵌入已被禁用"

使用youtube javascript api(http://code.google.com/apis/youtube/js_api_reference.html),我试图允许用户将视频嵌入他在我的应用中创建的某些内容中.我已经完成了所有工作,除了能够检测和处理视频不允许嵌入的情况.

目前,播放器加载并显示不允许视频的缩略图,并且只有在用户尝试播放时才会出错.这很糟糕,因为用户可能在保存/发送其内容之前不播放视频.我想先发制人地检测到不允许嵌入视频,并向用户显示有用的消息.

我能看到的唯一解决方案是实际播放它(以编程方式)并处理此时引发的错误.

现有解决方法:

  1. 嵌入播放器(embedSWF)
  2. onYouTubePlayerReady():在onStateChange事件监听器上添加onError.
  3. onStateChange(newState):当视频完成加载时,尝试播放它.
    例如if(newState == 5/*CUED*/){player.mute(); player.playVideo(); player.stopVideo(); player.unMute(); }
  4. onError(错误):如果视频无法在onStateChange中播放,则会在此处收到错误.

有没有更好的办法?

谢谢!
-抢

youtube youtube-api

4
推荐指数
1
解决办法
3142
查看次数